home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / reuse.lha / reuse / m2c / Heap.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  2KB  |  86 lines

  1. #include "SYSTEM_.h"
  2.  
  3. #ifndef DEFINITION_General
  4. #include "General.h"
  5. #endif
  6.  
  7. #ifndef DEFINITION_Memory
  8. #include "Memory.h"
  9. #endif
  10.  
  11. #ifndef DEFINITION_Heap
  12. #include "Heap.h"
  13. #endif
  14.  
  15. LONGCARD Heap_HeapUsed;
  16.  
  17. #define PoolSize    10240
  18. typedef struct S_1 *tBlockPtr;
  19. typedef struct S_1 {
  20.     tBlockPtr Successor;
  21.     struct S_2 {
  22.         CHAR A[PoolSize - 1 + 1];
  23.     } Block;
  24. } tBlock;
  25. static tBlockPtr BlockList;
  26. static ADDRESS PoolFreePtr;
  27. static ADDRESS PoolEndPtr;
  28.  
  29.  
  30. ADDRESS Heap_Alloc
  31. # ifdef __STDC__
  32. (LONGINT ByteCount)
  33. # else
  34. (ByteCount)
  35. LONGINT ByteCount;
  36. # endif
  37. {
  38.   tBlockPtr BlockPtr;
  39.  
  40.   ByteCount = (LONGINT)((BITSET)(ByteCount + General_MaxAlign - 1) & General_AlignMasks.A[General_MaxAlign]);
  41.   if ((LONGINT)(PoolEndPtr - (LONGCARD)PoolFreePtr) < ByteCount) {
  42.     BlockPtr = BlockList;
  43.     BlockList = (tBlockPtr)Memory_Alloc((LONGINT)sizeof(tBlock));
  44.     BlockList->Successor = BlockPtr;
  45.     PoolFreePtr = ADR(BlockList->Block);
  46.     PoolEndPtr = (ADDRESS)(PoolFreePtr + PoolSize);
  47.     INC1(Heap_HeapUsed, PoolSize);
  48.   }
  49.   INC1(PoolFreePtr, (LONGCARD)(ADDRESS)ByteCount);
  50.   return PoolFreePtr - (LONGCARD)(ADDRESS)ByteCount;
  51. }
  52.  
  53. void Heap_Free
  54. # ifdef __STDC__
  55. ()
  56. # else
  57. ()
  58. # endif
  59. {
  60.   tBlockPtr BlockPtr;
  61.  
  62.   while (BlockList != NIL) {
  63.     BlockPtr = BlockList;
  64.     BlockList = BlockList->Successor;
  65.     Memory_Free((LONGINT)sizeof(tBlock), (ADDRESS)BlockPtr);
  66.   }
  67.   PoolFreePtr = (ADDRESS)NIL;
  68.   PoolEndPtr = (ADDRESS)NIL;
  69.   Heap_HeapUsed = 0;
  70. }
  71.  
  72. void BEGIN_Heap()
  73. {
  74.   static BOOLEAN has_been_called = FALSE;
  75.  
  76.   if (!has_been_called) {
  77.     has_been_called = TRUE;
  78.  
  79.     BEGIN_General();
  80.     BEGIN_Memory();
  81.  
  82.     BlockList = NIL;
  83.     Heap_Free();
  84.   }
  85. }
  86.